Skip to content

Accelerate fitting further [see PR#330] by building eval-string only once in a fit#331

Open
adrianusler wants to merge 4 commits into
ECSHackWeek:mainfrom
adrianusler:feature/build-circuit-once
Open

Accelerate fitting further [see PR#330] by building eval-string only once in a fit#331
adrianusler wants to merge 4 commits into
ECSHackWeek:mainfrom
adrianusler:feature/build-circuit-once

Conversation

@adrianusler

@adrianusler adrianusler commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

The circuit was parsed into an eval-string in every single function call during the fit iterations. I changed the code in a way that allowed me to take the eval-string build out of the function calls. Compared to the performance of PR#330, this leads to a further acceleration by a factor ~2 (i.e. together they accelerate fitting by a factor ~10).

This PR builds upon the branch of PR #330, so that one should be merged before this one.

@gaoflow

gaoflow commented Jun 19, 2026

Copy link
Copy Markdown

I reproduced the lint failure from the current CI run. It is only formatting:

./impedance/models/circuits/circuits.py:146:38: E128 continuation line under-indented for visual indent
./impedance/models/circuits/circuits.py:147:38: E128 continuation line under-indented for visual indent
./impedance/models/circuits/circuits.py:148:38: E128 continuation line under-indented for visual indent
./impedance/models/circuits/circuits.py:154:38: E128 continuation line under-indented for visual indent
./impedance/models/circuits/circuits.py:155:38: E128 continuation line under-indented for visual indent
./impedance/models/circuits/circuits.py:156:38: E128 continuation line under-indented for visual indent
./impedance/models/circuits/fitting.py:226:5: E306 expected 1 blank line before a nested definition, found 0

This minimal patch fixes it:

diff --git a/impedance/models/circuits/circuits.py b/impedance/models/circuits/circuits.py
@@
         if self._is_fit() and not use_initial:
             arg_dict.update({"parameters": self.parameters_})
             eval_str, index = buildCircuit(self.circuit, frequencies,
-                                     *self.parameters_,
-                                     constants=self.constants, eval_string='',
-                                     index=0)
+                                           *self.parameters_,
+                                           constants=self.constants,
+                                           eval_string='', index=0)
@@
             warnings.warn("Simulating circuit based on initial parameters")
             arg_dict.update({"parameters": self.initial_guess})
             eval_str, index = buildCircuit(self.circuit, frequencies,
-                                     *self.initial_guess,
-                                     constants=self.constants, eval_string='',
-                                     index=0)
+                                           *self.initial_guess,
+                                           constants=self.constants,
+                                           eval_string='', index=0)

diff --git a/impedance/models/circuits/fitting.py b/impedance/models/circuits/fitting.py
@@
     eval_str, _ = buildCircuit(circuit, frequencies, *parameters,
                                constants=constants, eval_string='',
                                index=0)
     # maybe frequencies don't need to be passed as argument to buildCircuit
+
     def wrappedCircuit(frequencies, *parameters):

I verified locally with the same lint command:

python -m flake8 . --count --show-source "--exclude=*.ipynb_checkpoints"
0

I cannot push to this PR branch from here because my permission on ECSHackWeek/impedance.py is read-only.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants